package reflect

import (
	"fmt"
	"reflect"
)

type Printable interface {
	Print()
}

// 水果
type Fruit struct {
	// 名称
	Name string
	// ID
	Id int
	// 颜色
	Color string
}

func (f Fruit) Print() {

	t, v := reflect.TypeOf(f), reflect.ValueOf(f)
	attrNum := t.NumField()
	for i := 0; i < attrNum; i++ {
		field := t.Field(i)
		fieldName := field.Name
		fieldValue := v.Field(i).Interface()
		fmt.Println(field, fieldName, fieldValue)
	}
}

func (f *Fruit) ClearName() {
	f.Name = ""
}

func (f *Fruit) SetName(n string) {
	f.Name = n
}

// 苹果
type Apple struct {
	Fruit
	// 是否新鲜
	Fresh bool
}

// 红富士
type HongFuShi struct {
	Apple
	// 产地
	From string
}

// 西瓜
type WaterMellon struct {
	Fruit
	// 是否水分充足
	Water bool
}
